---
title: .family
---

import Tabs from "@theme/Tabs";
import TabItem from "@theme/TabItem";

Bunu okumadan önce, [providers](/docs/concepts2/providers) ve [onların nasıl okunacağı](/docs/concepts/reading) hakkında bilgi almayı düşünün.
Bu bölümde `.family` provider'ları değiştiricisinden detaylı olarak bahsedeceğiz.

`.family` değiştiricisinin tek bir amacı vardır: harici değerlerden bir provider oluşturmak.

`Aile` için bazı yaygın kullanım durumları şunlardır:

- Kimliğinden bir "Mesaj" almak için [FutureProvider]'ı ".family" ile birleştirin.
- Geçerli `Yerel Ayar`'ı bir provider'a iletin, böylece çevirileri biz halledebiliriz.

## Kullanım

Ailelerin çalışma şekli, provider'a ek bir parametre eklemektir.
Bu parametre provider'ımızda bir durum oluşturmak için serbestçe kullanılabilir.

Örneğin, kimliğinden bir "Mesaj" almak için "aile"yi [FutureProvider] ile birleştirebiliriz:

```dart
final messagesFamily = FutureProvider.family<Message, String>((ref, id) async {
  return dio.get('http://my_api.dev/messages/$id');
});
```

Daha sonra `messagesFamily` provider'ımızı kullanarak söz dizimi biraz değiştirildi.
Her zamanki sözdizimi artık çalışmayacak:

```dart
Widget build(BuildContext context, WidgetRef ref) {
  // Hata – messageFamily bir provider değil
  final response = ref.watch(messagesFamily);
}
```

Bunun yerine, `messagesFamily`'e bir parametre aktarmamız gerekiyor:

```dart
Widget build(BuildContext context, WidgetRef ref) {
  final response = ref.watch(messagesFamily('id'));
}
```

:::info
Farklı parametrelere sahip bir aileyi aynı anda kullanmak mümkündür.
Örneğin, Fransızca ve İngilizce çevirileri aynı anda okumak için `titleFamily'i kullanabiliriz:

```dart
@override
Widget build(BuildContext context, WidgetRef ref) {
  final frenchTitle = ref.watch(titleFamily(const Locale('fr')));
  final englishTitle = ref.watch(titleFamily(const Locale('en')));

  return Text('fr: $frenchTitle en: $englishTitle');
}
```

:::

## Parametre Kısıtlamaları


Ailelerin doğru çalışması için parametrenin doğru olması önemlidir.
provider'a iletilen tutarlı bir `hashCode` ve `==` değerine sahiptir.

İdeal olarak, parametre bir ilkel (bool/int/double/String), bir sabit (provider'lar) olmalıdır.
veya `==` ve `hashCode`u geçersiz kılan değişmez bir nesne.

### Parametre sabit olmadığında `autoDispose`u kullanmayı TERCİH EDERİM_:

Bir arama alanının girdisini provider'ına iletmek için aileleri kullanmak isteyebilirsiniz.
Ancak bu değer sık ​​sık değişebilir ve bir daha asla kullanılmayabilir.
Varsayılan olarak bir provider artık kullanılmasa bile hiçbir zaman yok edilmediğinden, bu durum boşa bellek kullanımına neden olabilir.

Hem `.family` hem de `.autoDispose`un kullanılması bellek sızıntısını düzeltir:

```dart
final characters = FutureProvider.autoDispose.family<List<Character>, String>((ref, filter) async {
  return fetchCharacters(filter: filter);
});
```

## Bir aileye birden fazla parametre iletin

Ailelerin, birden fazla değeri bir provider'a aktarmaya yönelik yerleşik desteği yoktur.

Öte yandan, bu değer herhangi bir şey olabilir (yukarıda belirtilen kısıtlamalarla eşleştiği sürece).

Bu içerir:

- Bir grup [Tuple](http://pub.dev/packages/Tuple).
- [Freezed] veya [built_value](https://pub.dev/packages/built_value) ile oluşturulan nesneler.
- [Eşitlenebilir](https://pub.dev/packages/equatable) kullanan nesneler.

Burada [Freezed] ve [Equatable] kullanan bir örnek verilmiştir:

<Tabs
  groupId="family"
  defaultValue="freezed"
  values={[
    { label: 'Freezed', value: 'freezed', },
    { label: 'Equatable', value: 'equatable', },
  ]}
>

<TabItem value="freezed">

```dart
@freezed
abstract class MyParameter with _$MyParameter {
  factory MyParameter({
    required int userId,
    required Locale locale,
  }) = _MyParameter;
}

final exampleProvider = Provider.autoDispose.family<Something, MyParameter>((ref, myParameter) {
  print(myParameter.userId);
  print(myParameter.locale);
  // Kullanıcı kimliği/yerel ayar ile bir şeyler yapın
});

@override
Widget build(BuildContext context, WidgetRef ref) {
  int userId; // Kullanıcı kimliğini her yerden oku
  final locale = Localizations.localeOf(context);

  final something = ref.watch(
    exampleProvider(MyParameter(userId: userId, locale: locale)),
  );

  ...
}
```

</TabItem>
<TabItem value="equatable">

```dart
class MyParameter extends Equatable  {
  MyParameter({
    required this.userId,
    required this.locale,
  });

  final int userId;
  final Locale locale;

  @override
  List<Object> get props => [userId, locale];
}

final exampleProvider = Provider.family<Something, MyParameter>((ref, myParameter) {
  print(myParameter.userId);
  print(myParameter.locale);
  // Kullanıcı kimliği/yerel ayar ile bir şeyler yapın
});

@override
Widget build(BuildContext context, WidgetRef ref) {
  int userId; // Kullanıcı kimliğini her yerden oku
  final locale = Localizations.localeOf(context);

  final something = ref.watch(
    exampleProvider(MyParameter(userId: userId, locale: locale)),
  );

  ...
}
```

</TabItem>
</Tabs>

[freezed]: https://pub.dev/packages/freezed
[provider]: https://pub.dev/documentation/riverpod/latest/riverpod/Provider-class.html
[Equatable]: https://pub.dev/packages/equatable
[futureprovider]: https://pub.dev/documentation/hooks_riverpod/latest/hooks_riverpod/FutureProvider-class.html
